home *** CD-ROM | disk | FTP | other *** search
/ Chip: Internet / Chip Internet.iso / wwwutil / hotjava.ins / hotjava.exe / hotjava / classsrc / net / www / protocol / news / NewsDirectoryEntry.java < prev    next >
Text File  |  1995-08-11  |  4KB  |  151 lines

  1. /*
  2.  * @(#)NewsDirectoryEntry.java    1.6 95/03/28 James Gosling, Jonathan Payne
  3.  * 
  4.  * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved.
  5.  * 
  6.  * Permission to use, copy, modify, and distribute this software and its
  7.  * documentation for NON-COMMERCIAL purposes and without fee is hereby
  8.  * granted provided that this copyright notice appears in all copies. Please
  9.  * refer to the file "copyright.html" for further important copyright and
  10.  * licensing information.
  11.  * 
  12.  * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
  13.  * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  14.  * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
  15.  * OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
  16.  * LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR
  17.  * ITS DERIVATIVES.
  18.  */
  19.  
  20. package net.www.protocol.news;
  21.  
  22. import java.io.*;
  23. import java.util.*;
  24. import net.nntp.*;
  25. import net.smtp.SmtpClient;
  26. import browser.Applet;
  27. import browser.WRWindow;
  28. import browser.DocumentManager;
  29. import net.TelnetInputStream;
  30. import net.UnknownHostException;
  31. import awt.*;
  32.  
  33. class NewsDirectoryEntry {
  34.     String subject;
  35.     String author;
  36.     String key;
  37.     String ID;
  38.     String Ref;
  39.     Vector Refs;
  40.     int anum;
  41.     NewsDirectoryEntry next;
  42.     NewsDirectoryEntry child;
  43.     
  44.     NewsDirectoryEntry(String s, String a, int n, String id, String ref) {
  45.     subject = s;
  46.     author = a;
  47.     ID = id;
  48.     Ref = ref;
  49.     int kst = 0;
  50.     int kend = s.length();
  51.     anum = n;
  52.     while (kst < kend) {
  53.         if (s.charAt(kst) <= ' ')
  54.         kst++;
  55.         else if (s.startsWith("Re:", kst) || s.startsWith("re:", kst))
  56.         kst += 3;
  57.         else
  58.         break;
  59.     }
  60.     while (kst < kend) {
  61.         if (s.charAt(kend - 1) <= ' ')
  62.         kend--;
  63.         else
  64.         break;
  65.     }
  66.     if (kst < kend)
  67.         key = s.substring(kst, kend);
  68.     else
  69.         key = s;
  70.     if (ref != null) {
  71.         kst = 0;
  72.         int len = ref.length();
  73.         Refs = new Vector();
  74.         while (kst < len) {
  75.         if ((kst = ref.indexOf('<', kst)) < 0)
  76.             break;
  77.         if ((kend = ref.indexOf('>', kst + 1)) < 0)
  78.             break;
  79.         Refs.addElement(ref.substring(kst, kend + 1));
  80.         kst = kend + 1;
  81.         }
  82.     }
  83.     }
  84.     
  85.     /**
  86.      * This procedure inserts this node into a given subtree.
  87.      * The new root of the subtree is returned since this root
  88.      * may become the new root.
  89.      */
  90.     NewsDirectoryEntry insert(NewsDirectoryEntry root, boolean toplevel) {
  91.     if (root == null) {
  92.         // There is no more subtree.  Terminate recursion.
  93.         return this;
  94.     }
  95.     if (references(root)) {
  96.         // We are a descendant of this root.  Recurse.
  97.         root.child = insert(root.child, false);
  98.         return root;
  99.     }
  100.     if (root.references(this)) {
  101.         // We are an ancestor of this subtree.  We become the new root.
  102.         child = root;
  103.         // Now we must insert all of the old tree's ancestors either
  104.         // as our siblings or as our children (the old root's siblings)
  105.         // deciding based on their Refs vectors.
  106.         NewsDirectoryEntry n = root.next;
  107.         NewsDirectoryEntry lastsibling = this;
  108.         NewsDirectoryEntry lastchild = root;
  109.         while (n != null) {
  110.         if (n.references(this)) {
  111.             lastchild.next = n;
  112.             lastchild = n;
  113.         } else {
  114.             lastsibling.next = n;
  115.             lastsibling = n;
  116.         }
  117.         n = n.next;
  118.         }
  119.         lastsibling.next = null;
  120.         lastchild.next = null;
  121.         return this;
  122.     }
  123.     if (toplevel && key != null && key.equals(root.key)) {
  124.         // We are in the same conversation as this firstlevel root node.
  125.         root.child = insert(root.child, false);
  126.         return root;
  127.     }
  128.     root.next = insert(root.next, toplevel);
  129.     return root;
  130.     }
  131.  
  132.     boolean references(NewsDirectoryEntry n) {
  133.     return (Refs != null && Refs.contains(n.ID));
  134.     }
  135.  
  136.     boolean find(String mid) {
  137.     if (mid != null) {
  138.         NewsDirectoryEntry n = this;
  139.         while (n != null) {
  140.         if (mid.equalsIgnoreCase(n.ID) || (n.child != null
  141.                            && n.child.find(mid)))
  142.         {
  143.             return true;
  144.         }
  145.         n = n.next;
  146.         }
  147.     }
  148.     return false;
  149.     }
  150. }
  151.